package com.like.bluetooth.classic.client.connect.executor

import android.content.Context
import com.like.bluetooth.executor.BluetoothExecutor
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow

/**
 * 中心设备蓝牙连接及数据操作的执行者。
 */
abstract class AbstractConnectExecutor(context: Context, val address: String?) : BluetoothExecutor(context) {

    /**
     * 连接蓝牙设备，并在连接断开后自动重连。
     *
     * @param autoConnectInterval   自动重连间隔时间，毫秒。默认为0，表示不自动重连。
     * @param timeout               连接超时间隔，毫秒。默认10000.
     * @param onConnected           连接成功回调，主线程
     * @param onDisconnected        连接断开回调，主线程
     * 注意：此方法为持续监听，调用此方法后，记得不使用的时候要调用[close]或者[disconnect]取消监听。
     */
    abstract fun connect(
        scope: CoroutineScope,
        autoConnectInterval: Long = 0L,
        timeout: Long = 10000L,
        onConnected: () -> Unit,
        onDisconnected: ((Throwable) -> Unit)? = null
    )

    /**
     * 断开蓝牙设备
     * @throws [com.like.bluetooth.exception.BluetoothException]
     */
    abstract fun disconnect()

    /**
     * 写数据
     *
     * @param data                      需要写入的数据。
     * @throws [com.like.bluetooth.exception.BluetoothException]
     */
    abstract suspend fun write(
        data: ByteArray,
        timeout: Long = 10000L
    )

    /**
     * 设置读数据的回调。
     *
     * 注意：
     * 1、实际读取数据在连接成功后会自动开始。
     * 2、可以使用[kotlinx.coroutines.Job.cancel]方法来取消协程作用域，从而会自动移除此监听。即 flow 停止收集则自动移除此监听，否则会一直存在。
     */
    abstract fun setReadCallback(): Flow<ByteArray>

}
